// 字符串变量

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int i;
    char *s = "Hello World";
    // 以下写法会导致崩溃
    // s[0] = 'B';
    char *s2 = "Hello World";
    char s3[] = "Hello World";

    // s 和 s2 指向代码段，是只读的，与存储本地变量的地址不同
    // 这两个指针指向一个字符串常量
    // 因此，实际上 s 是 const char* s
    // 试图改写 s 指向的字符串会导致严重的后果
    // 如果需要修改字符串，应该用数组，
    // 则编译器从把实际存放字符串的地方拷贝到储存变量的地方
    printf("s  = %p\n", s);
    printf("s2 = %p\n", s2);
    printf("s3 = %p\n", s3);
    printf("&i = %p\n", &i);
    s3[0] = 'B';
    printf("WUHU! s3[0] = %c\n", s3[0]);


    // 如何选择指针或数组？
    // 数组：字符串就在这里
    //  作为本地变量，空间会被自动回收

    // 指针：字符串不知道在哪里
    //  需要只读的字符串
    //  用于传参
    //  动态分配空间（malloc）


    // char*: 可能是字符串，也可能指向单个字符
    // 只有当它指向的字符数组结尾有0时，才能说他所指的是字符串
    char test[] = "Hello World\0h";
    printf("%p\n", &test);
    printf("sizeof(test) = %d\n", sizeof(test));

    char *test2 = "Hello World\0h";
    printf("test2  = %p\n", test2);
    printf("&test2 = %p\n", &test2);
    printf("sizeof(test2) = %d\n", sizeof(test2));
    
    return 0;
}